package main
import "fmt"

const MAX int = 3

func main() {
    var a int = 10
    var ip *int
    var ptr *int
    ip = &a

    fmt.Printf("变量a的地址：%x\n", &a)
    fmt.Printf("ip变量存储的指针地址：%x\n", ip)
    // 在指针类型前面加上 * 号（前缀）来获取指针所指向的内容。
    fmt.Printf("*ip变量的值：%d\n", *ip)
    // 空指针
    fmt.Printf("*ptr变量的值：%x\n", ptr)

    // 指针数组
    aa := []int {10, 100, 200}
    var i int
    var ptr1 [MAX]*int
    for i = 0; i < MAX; i++ {
        ptr1[i] = &aa[i]
    }
    for i = 0; i < MAX; i++ {
        fmt.Printf("a[%d] = %d 存储地址：%v\n", i, *ptr1[i], ptr1[i])
    }

    // 指向指针的指针
    var pptr **int
    a = 3000
    ptr = &a
    pptr = &ptr
    fmt.Printf("变量 a = %d\n", a)
    fmt.Printf("指针变量 *ptr = %d\n", *ptr)
    fmt.Printf("指向指针的指针变量 **ptr = %d\n", **pptr)

    // 指针作为函数参数
    a = 100
    var b int = 200
    fmt.Printf("交换前 a 的值：%d\n", a)
    fmt.Printf("交换前 b 的值：%d\n", b)
    swap(&a, &b)
    fmt.Printf("交换后 a 的值：%d\n", a)
    fmt.Printf("交换后 b 的值：%d\n", b)
}

func swap(x *int, y *int) {
    var temp int
    temp = *x
    *x = *y
    *y = temp
}
